// commondjs 不支持这种导入方式
// import { jwt } from 'jsonwebtoken';

//导入JWT
const jwt = require('jsonwebtoken');

// 自定义一个密钥
const personalKey = '12313ajdakfhaJJLjdjLJLjjL';

// 写死一个用户名
const obj = { username: '13812345678', password: 'admin123' };

// 校验token是否已过期
const checkToken = (token) => {
  /**
   * 传入三个参数，token 和 密钥 必传，后面的回调函数可选
   * 如果在传入的回调函数中对err进行了处理，在外层的 try catch函数中会捕获不到错误
   */
  const code = jwt.verify(token, personalKey, (err, decode) => {
    if (err) {
      if (err.name === 'TokenExpiredError') {
        const str = {
          iat: 1,
          exp: 0,
          msg: 'token已过期'
        };
        return str;
      } else if (err.name === 'JsonWebTokenError') {
        const str = {
          iat: 1,
          exp: 0,
          msg: '无效的token'
        };
        return str;
      }
    } else {
      return decode;
    }
  });

  // 如果当前时间小于token的有效时间，说明token还在有效期内，反之 失效
  if (code.iat < code.exp) {
    return true;
  } else {
    return false;
  }
};

// 中间件主函数
module.exports = (req, res, next) => {
  if (req.method === 'POST' && req.path === '/tokenCheck') {
    // 从请求头里面取出传过来的token
    const oldToken = req.headers.authorization.split(' ')[1];
    const isvalid = checkToken(oldToken);
    if (!isvalid) {
      return res.status(401).json({
        msg: 'token 已过期'
      });
    } else {
      return res.status(200).json({
        username: obj.username,
        msg: '校验成功',
        code: 10000
      });
    }
  }
  if (req.method === 'POST' && req.path === '/login') {
    const { username, password } = req.body.body;
    if (username === obj.username && password === obj.password) {
      const token = jwt.sign({ username: obj.username }, personalKey, {
        // 传入数字 单位是秒
        expiresIn: 60 * 60
      });
      return res.status(200).json({
        user: {
          name: 'Ryan',
          //   token的生成可在网上搜JWT
          msg: '登录成功!!',
          token: token
        }
      });
    } else {
      return res.status(400).json({ message: '用户名或者密码错误' });
    }
  }

  if (req.method === 'POST' && req.path === '/register') {
    const { username, password } = req.body.body;
    if (username == obj.username && password == obj.password) {
      return res.status(400).json({ message: '该用户已存在' });
    } else {
      return res.status(200).json({
        user: {
          name: obj.username,
          password: obj.password
        }
      });
    }
  }

  if (req.method === 'POST' && req.path === '/helloworld') {
    const { username, password } = req.body.body;
    if (req.body.username === username && req.body.password === password) {
      return res.status(200).json({
        msg: '登录成功',
        token: 123
      });
    }
  }

  next();
};
